//
//  CMDBPageContentView.swift
//  CMDB
//
//  Created by 曹桂祥 on 17/4/8.
//  Copyright © 2017年 CMDB. All rights reserved.
//

import UIKit

protocol CMDBPageContentViewDelegate : class{
    
    func contentView(titleView : CMDBPageContentView,progress : CGFloat ,sourceIndex : Int,targetIndex : Int)
}

private let ContentCellID = "ContentCellID"

class CMDBPageContentView: CMDBBaseView {
    
    var childVcs : [UIViewController]
    
    weak var parentController : UIViewController?
    
    weak var delegate : CMDBPageContentViewDelegate?
    
    var startOffsetX : CGFloat        = 0
    
    var isForbidScrollDelegate        = false
    
    internal lazy var collectionView : UICollectionView = {[weak self] in
        // 1.创建layout
        let layout                     = UICollectionViewFlowLayout()
        layout.itemSize                = (self?.bounds.size)!
        layout.minimumLineSpacing      = 0
        layout.minimumInteritemSpacing = 0
        layout.scrollDirection         = .Horizontal
        
        // 2.创建UICollectionView
        let collectionView = UICollectionView(frame: CGRect.zero, collectionViewLayout: layout)
        collectionView.showsHorizontalScrollIndicator = false
        collectionView.pagingEnabled                  = true
        collectionView.bounces                        = false
        collectionView.dataSource                     = self
        collectionView.delegate                       = self
        collectionView.scrollsToTop                   = false
        collectionView.registerClass(UICollectionViewCell.self, forCellWithReuseIdentifier: ContentCellID)
        
        return collectionView
        }()

    
    init(frame: CGRect,childVcs : [UIViewController], parentController : UIViewController?) {
        
        self.childVcs         = childVcs
        
        self.parentController = parentController
        
        super.init(frame: frame)
        
        setupUI()
        
    }
    
    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
    
}


extension CMDBPageContentView {
    
    internal func setupUI(){
        
        for childVc in childVcs {
            parentController?.addChildViewController(childVc)
        }

        addSubview(collectionView)
        collectionView.frame = bounds
    }
    
}


extension CMDBPageContentView : UICollectionViewDataSource {
    
    func collectionView(collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
        return childVcs.count
    }
    
    func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell {
        
        let  cell = collectionView.dequeueReusableCellWithReuseIdentifier(ContentCellID, forIndexPath: indexPath)
        
        for view in cell.contentView.subviews {
            view.removeFromSuperview()
        }
        
        let childVc = childVcs[(indexPath as NSIndexPath).item]
        childVc.view.frame = cell.contentView.bounds
        cell.contentView.addSubview(childVc.view)
        
        return cell

    }

}


// MARK:- 遵守UICollectionViewDelegate
extension CMDBPageContentView : UICollectionViewDelegate {
    
    func scrollViewWillBeginDragging(scrollView: UIScrollView) {
        
        isForbidScrollDelegate = false
        
        startOffsetX = scrollView.contentOffset.x

    }
    
    func scrollViewDidScroll(scrollView: UIScrollView) {
        
        // 0.判断是否是点击事件
        if isForbidScrollDelegate { return }
        
        // 1.定义获取需要的数据
        var progress : CGFloat = 0
        var sourceIndex : Int = 0
        var targetIndex : Int = 0
        
        // 2.判断是左滑还是右滑
        let currentOffsetX = scrollView.contentOffset.x
        let scrollViewW = scrollView.bounds.width
        if currentOffsetX > startOffsetX { // 左滑
            // 1.计算progress
            progress = currentOffsetX / scrollViewW - floor(currentOffsetX / scrollViewW)
            
            // 2.计算sourceIndex
            sourceIndex = Int(currentOffsetX / scrollViewW)
            
            // 3.计算targetIndex
            targetIndex = sourceIndex + 1
            if targetIndex >= childVcs.count {
                targetIndex = childVcs.count - 1
            }
            
            // 4.如果完全划过去
            if currentOffsetX - startOffsetX == scrollViewW {
                progress = 1
                targetIndex = sourceIndex
                sourceIndex = targetIndex - 1
            }
            
        } else { // 右滑
            // 1.计算progress
            progress = 1 - (currentOffsetX / scrollViewW - floor(currentOffsetX / scrollViewW))
            
            // 2.计算targetIndex
            targetIndex = Int(currentOffsetX / scrollViewW)
            
            // 3.计算sourceIndex
            sourceIndex = targetIndex + 1
            if sourceIndex >= childVcs.count {
                sourceIndex = childVcs.count - 1
            }
            
        }
        
        // 3.将progress/sourceIndex/targetIndex传递给titleView
        delegate?.contentView(self, progress: progress, sourceIndex: sourceIndex, targetIndex: targetIndex)
       
    }
}

extension CMDBPageContentView{
    
    func setCurrentIndex(currentIndex : Int) {
        
        // 1.记录需要进制执行代理方法
        isForbidScrollDelegate = true
        
        // 2.滚动正确的位置
        let offsetX = CGFloat(currentIndex) * collectionView.frame.width
        collectionView.setContentOffset(CGPoint(x: offsetX, y: 0), animated: false)
    }
    
}



